home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Freeware 1998 June
/
SGI Freeware 1998 June.iso
/
dist
/
fw_UMINNgopher.idb
/
usr
/
freeware
/
src
/
gopher_1.12
/
object
/
GDgopherdir.c.z
/
GDgopherdir.c
Wrap
C/C++ Source or Header
|
1997-09-09
|
5KB
|
270 lines
/********************************************************************
* $Author: drich $
* $Revision: 1.1 $
* $Date: 1995/10/03 04:09:42 $
* $Source: /proj/freeware1.0/gopher1.12/src/object/RCS/GDgopherdir.c,v $
* $Status: $
*
* Paul Lindner, University of Minnesota CIS.
*
* Copyright 1991, 1992 by the Regents of the University of Minnesota
* see the file "Copyright" in the distribution for conditions of use.
*********************************************************************
* MODULE: GDgopherdir.c
* Implement gopher directory routines
*********************************************************************
* Revision History:
* $Log: GDgopherdir.c,v $
* Revision 1.1 1995/10/03 04:09:42 drich
* gopher 1.2 check-in
*
* Revision 1.1 1992/12/10 23:27:52 lindner
* gopher 1.1 release
*
*
*********************************************************************/
#include "GDgopherdir.h"
#include "Malloc.h"
#include <string.h>
#include <stdio.h>
extern int DEBUG;
/***********************************************************************
** Stuff for GopherDirObjs
**
***********************************************************************/
GopherDirObj*
GDnew(size)
int size;
{
int i;
GopherDirObj *temp;
temp = (GopherDirObj*) malloc(sizeof(GopherDirObj));
temp->Gophers = DAnew(size, GSnew, GSinit, GSdestroy, GScpy);
temp->Title = STRnew();
temp->currentitem = 1;
GDinit(temp);
return(temp);
}
void
GDdestroy(gd)
GopherDirObj *gd;
{
int i;
DAdestroy(gd->Gophers);
STRdestroy(gd->Title);
free(gd);
}
void
GDinit(gd)
GopherDirObj *gd;
{
int i;
DAinit(gd->Gophers);
STRinit(gd->Title);
}
extern int DEBUG;
/** This proc adds a GopherObj to a gopherdir. **/
void
GDaddGS(gd, gs)
GopherDirObj *gd;
GopherObj *gs;
{
int top;
DApush(gd->Gophers, gs);
}
/*
* Really weird!!! We need this for qsort, don't know why we can't use
* GScmp...
*/
int
GSqsortcmp(gs1, gs2)
GopherObj **gs1, **gs2;
{
if (GSgetTitle(*gs1) == NULL)
return(1);
if (GSgetTitle(*gs2) == NULL)
return(-1);
/** No numbering set on either entry, or both numbered
entries have the same number **/
if (GSgetNum(*gs1) == GSgetNum(*gs2))
return(strcmp(GSgetTitle(*gs1), GSgetTitle(*gs2)));
/** first one numbered, second not **/
if (GSgetNum(*gs1) != -1 && GSgetNum(*gs2) == -1)
return(-1);
/** second one numbered, first not **/
if (GSgetNum(*gs1) == -1 && GSgetNum(*gs2) != -1)
return(1);
/** Both numbered, integer compare them **/
return(GSgetNum(*gs1) - GSgetNum(*gs2));
}
/*
* Sorts a gopher directory
*/
void
GDsort(gd)
GopherDirObj *gd;
{
DAsort(gd->Gophers, GSqsortcmp);
}
void
GDtoNet(gd, sockfd)
GopherDirObj *gd;
int sockfd;
{
int i;
for (i=0; i< GDgetNumitems(gd); i++) {
GStoNet(GDgetEntry(gd, i), sockfd);
}
}
void
GDtoNetHTML(gd, sockfd)
GopherDirObj *gd;
int sockfd;
{
int i;
writestring(sockfd, "<MENU>\r\n");
for (i=0; i< GDgetNumitems(gd); i++) {
writestring(sockfd, "<LI>");
GStoNetHTML(GDgetEntry(gd, i), sockfd);
}
writestring(sockfd, "</MENU>");
}
/*
* Fill up a GopherDirObj with GopherObjs, given a gopher directory coming
* from sockfd.
*
* For each GopherObj retrieved, eachitem() is executed.
*
* Returns
*/
int
GDfromNet(gd, sockfd, eachitem)
GopherDirObj *gd;
int sockfd;
int (*eachitem)();
{
static GopherObj *TempGopher;
static char ZesTmp[1024];
int j, i;
if (TempGopher == NULL)
TempGopher = GSnew();
for (j=0; ; j++) {
ZesTmp[0] = '\0';
GSinit(TempGopher);
i = GSfromNet(TempGopher, sockfd);
if (i==0) {
GDaddGS(gd, TempGopher);
if (eachitem != NULL)
eachitem();
}
else if (i==1)
return(j);
/*** Unknown object type ***/
if (i== -2) {
j = j-1;
if (j<0) j=0;
readline(sockfd, ZesTmp, 1024); /** Get the rest of the line **/
;
}
if (i==-1) {
j = j-1;
if (j<0) j=0;
readline(sockfd, ZesTmp, 1024); /** Get the rest of the line **/
return(j);
}
}
}
/*
* Given an open file descriptor and an inited GopherDirobj,
* read in gopher links, and add them to a gopherdir
*/
void
GDfromLink(gd, fd, host, port)
GopherDirObj *gd;
int fd;
char *host;
int port;
{
GopherObj *gs;
gs = GSnew();
while (GSfromLink(gs, fd, host, port) != -1) {
GDaddGS(gd, gs);
GSinit(gs);
}
GSdestroy(gs);
}
void
GDtoLink(gd, fd)
GopherDirObj *gd;
int fd;
{
int i;
for (i=0; i< GDgetNumitems(gd); i++) {
GStoLink(GDgetEntry(gd, i), fd);
}
}